package com.zzyl.nursing.service.impl;

import java.util.*;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.Page;
import com.zzyl.common.exception.base.BaseException;
import com.zzyl.common.utils.DateUtils;
import com.zzyl.common.utils.StringUtils;
import com.zzyl.framework.web.service.TokenService;
import com.zzyl.nursing.dto.UserLoginRequestDto;
import com.zzyl.nursing.service.WechatService;
import com.zzyl.nursing.vo.LoginVo;
import com.zzyl.serve.domain.NursingProject;
import com.zzyl.serve.mapper.NursingProjectMapper;
import com.zzyl.serve.service.impl.NursingProjectServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;
import com.zzyl.nursing.mapper.FamilyMemberMapper;
import com.zzyl.nursing.domain.FamilyMember;
import com.zzyl.nursing.service.IFamilyMemberService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

/**
 * 老人家属Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-10-13
 */
@Service
public class FamilyMemberServiceImpl extends ServiceImpl<FamilyMemberMapper, FamilyMember> implements IFamilyMemberService
{
    @Autowired
    private FamilyMemberMapper familyMemberMapper;
    @Autowired
    private WechatService wechatService;

    @Autowired
    private TokenService tokenService;   //要使用其他模块下的bean对象中的方法需要在当前模块中引入其他模块的依赖




    static List<String> DEFAULT_NICKNAME_PREFIX = ListUtil.of("生活更美好",
            "大桔大利",
            "日富一日",
            "好柿开花",
            "柿柿如意",
            "一椰暴富",
            "大柚所为",
            "杨梅吐气",
            "天生荔枝"
    );
    @Autowired
    private NursingProjectMapper nursingProjectMapper;


    /**
     * 查询老人家属
     * 
     * @param id 老人家属主键
     * @return 老人家属
     */
    @Override
    public FamilyMember selectFamilyMemberById(Long id)
    {
        return getById(id);
    }

    /**
     * 查询老人家属列表
     * 
     * @param familyMember 老人家属
     * @return 老人家属
     */
    @Override
    public List<FamilyMember> selectFamilyMemberList(FamilyMember familyMember)
    {
        return familyMemberMapper.selectFamilyMemberList(familyMember);
    }

    /**
     * 新增老人家属
     * 
     * @param familyMember 老人家属
     * @return 结果
     */
    @Override
    public int insertFamilyMember(FamilyMember familyMember)
    {
        return save(familyMember) ? 1 : 0;
    }

    /**
     * 修改老人家属
     * 
     * @param familyMember 老人家属
     * @return 结果
     */
    @Override
    public int updateFamilyMember(FamilyMember familyMember)
    {
        return updateById(familyMember) ? 1 : 0;
    }

    /**
     * 批量删除老人家属
     * 
     * @param ids 需要删除的老人家属主键
     * @return 结果
     */
    @Override
    public int deleteFamilyMemberByIds(Long[] ids)
    {
        return removeByIds(Arrays.asList(ids)) ? 1 : 0;
    }

    /**
     * 删除老人家属信息
     * 
     * @param id 老人家属主键
     * @return 结果
     */
    @Override
    public int deleteFamilyMemberById(Long id)
    {
        return removeById(id) ? 1 : 0;
    }

    @Override
    public LoginVo login(UserLoginRequestDto userLoginRequestDto) {
            //1.获取openid
        //1.1当我们再点击登陆的那一刻,前端会接收到三个参数 code,nickName,phoneCode 将其封装到userLoginRequestDto对象中
         //1.2再根据dto中的code去调用微信的接口获取openid,该openid是该用户在该微信小程序中唯一标识
        String openid = wechatService.getOpenid(userLoginRequestDto.getCode());
             if(StringUtils.isEmpty(openid)){
                 throw new RuntimeException("获取openid失败");
             }
           //2. 根据openid查询数据库,判断是不是新用户 (因为openid是唯一标识)
        FamilyMember familyMember = familyMemberMapper.selectOne(Wrappers.<FamilyMember>lambdaQuery(FamilyMember.class).eq(FamilyMember::getOpenId,openid));
             //判断是否为新用户
        if(ObjectUtil.isEmpty(familyMember)){
            //使用构建者模式构建对象 在该实体类上我们要加上注解@builder
            //如果是新用户,创建的openid赋值给familyMember,给新用户设置一个openid作为唯一标识
            familyMember= FamilyMember.builder().openId(openid).build();
        }
        //4.走到这里说明不是新用户,调用getPhone方法获取该微信用户的手机号
        String phone = wechatService.getPhone(userLoginRequestDto.getPhoneCode());

        //判断手机号是否为空
        if(StringUtils.isEmpty(phone)){
          throw new BaseException("获取手机号失败");
        }
        //5.手机号不为空,在此出判断 新增操作或者是修改操作
         saveOrUpdateFamilyMember(familyMember,phone); //此时已经对familyMember对象中的name 属性进行了设置


        //6. 返回登录信息 有两个参数分别为jwttoken和昵称

        //6.1token的生成使用tokenservice 生成  组成部分为用户的id 和用户名
        // 注入tokenservice
        Map<String,Object> params = new HashMap<>();
        params.put("userId",familyMember.getId());
        params.put("userName",familyMember.getName());
        String token = tokenService.createToken(params);


        LoginVo loginVo = new LoginVo();
        loginVo.setToken(token);
        //将familyMember中的name设置进去
        loginVo.setNickName(familyMember.getName());
        /*
        * 此时的话有一个bug 修改人的值为1但是我们没有做修改 这是因为我们使用mybatisplus的自动填充功能因此我们需要在
        *由于小程序端的所有请求不走后台的用户，在新增或修改的时候，不需要自动填充创建人和修改人
        * */
        return loginVo;
    }



    /**
     * 新增或修改用户
     * @param familyMember
     * @param phone
     */
    private void saveOrUpdateFamilyMember(FamilyMember familyMember, String phone) {
              //1.根据数据库中的phone电话号码和当前用户的手机号进行比较

           if(ObjectUtil.notEqual(familyMember.getPhone(),phone)){
               //此时数据库中有该用户的手机号和当前用户的手机号不相等(此时说明以前是登陆过的将新号码更新), 而从微信中获取的手机号不可能为空,将手机号设置进去
               familyMember.setPhone(phone);
           }
           //2.判断familyMember对象中的id是否为空,为空则新增,不为空则修改
        if(ObjectUtil.isNotEmpty(familyMember.getId())){
            //修改
            updateById(familyMember);
            return;
        }

        //新增
        //设置用户昵称 新用户需要一个新的昵称 组成为集合随机元素+手机号后四位
        Random r =new Random();
        int index = r.nextInt(DEFAULT_NICKNAME_PREFIX.size());
        familyMember.setName(DEFAULT_NICKNAME_PREFIX.get(index)+phone.substring(phone.length()-4));

        save(familyMember);

    }

}
